package cmux

import (
	"encoding/binary"
	"io"
	"net"

	"cmux"
)

// 假设自定义协议以特定的4字节魔术数字开头
var magicNumber = []byte{0xAB, 0xCD}

// CustomProtocolMatcher 是一个自定义协议的匹配器
func CustomProtocolMatcher(r io.Reader) bool {
	// 创建一个足够大的缓冲区来读取魔术数字
	buf := make([]byte, 4)

	// 从连接中读取4个字节
	_, err := io.ReadFull(r, buf)
	if err != nil {
		// 如果读取失败，我们无法确定连接是否匹配
		return false
	}

	// 将读取的字节转换为uint16
	magic := binary.BigEndian.Uint16(buf)

	// 检查魔术数字是否与自定义协议的魔术数字匹配
	return magic == binary.BigEndian.Uint16(magicNumber)
}

func main() {
	// 设置基础监听器
	l, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer l.Close()

	// 创建 cmux 实例
	m := cmux.New(l)

	// 使用自定义匹配器创建自定义协议的监听器
	//customProtoListener := m.Match(CustomProtocolMatcher)
	m.Match(CustomProtocolMatcher)

	// ... 处理自定义协议的连接 ...

	// 启动多路复用器
	if err := m.Serve(); err != nil {
		panic(err)
	}
}
